﻿#region License

// PentaBiz - Sustainable Software Development Framework Copyright (C) 2013 Zoltán Csizmazia
// 
// This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
// 
// This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 

#endregion

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using PentaBiz;
using PentaBiz.Cloud.Services;
using PentaBiz.Cloud.Services.MetaService;
using System.Net;
using PentaBiz.Diagnostics;

namespace Cloud.Services.Hosting.Testing
{
    [TestClass]
    public class UnitTestGenericServiceManager
    {
        [TestMethod]
        [TestCategory("GenericServiceHostManager")]
        public void TestGenericServicedCloudServiceHosts()
        {
            using (var g = new GenericServiceHostManager())
            {
                g.Start(EndpointMode.UniqueEndpoint);

                Assert.AreEqual(3, g.CloudServiceHosts.Count,
                                "There must be 3 services hosted in GenericServiceManager");


                g.Stop();
            }
        }

        [TestMethod]
        [TestCategory("GenericServiceHostManager")]
        public void TestGenericServiceHostManagerStartStopPerformance()
        {
            for (int i = 0; i < 10000; i++)
            {
                using (var g = new GenericServiceHostManager())
                {
                    g.Start(EndpointMode.UniqueEndpoint);

                    Assert.AreEqual(3, g.CloudServiceHosts.Count,
                                    "There must be 3 services hosted in GenericServiceManager");


                    g.Stop();
                }
            }
        }

        [TestMethod]
        [TestCategory("GenericServiceHostManager")]
        public void TestGenericServiceHostManagerPerformanceWithWebGet()
        {
            using (var g = new GenericServiceHostManager())
            {
                g.Start(EndpointMode.UniqueEndpoint);

                Assert.AreEqual(3, g.CloudServiceHosts.Count,
                                "There must be 3 services hosted in GenericServiceManager");

                g.CloudServiceHosts
                 .ToList()
                 .ForEach(AssertServiceResponse);


                g.Stop();
            }
        }

        [TestMethod]
        [TestCategory("GenericServiceHostManager")]
        public void TestGenericServiceHostManagerRestartable()
        {
            for (int i = 0; i < 2; i++)
            {
                using (var g = new GenericServiceHostManager())
                {
                    g.Start(EndpointMode.StandardEnpoint);

                    Assert.AreEqual(3, g.CloudServiceHosts.Count,
                                    "There must be 3 services hosted in GenericServiceManager");

                    g.CloudServiceHosts
                     .ToList()
                     .ForEach(AssertServiceResponse);


                    g.Stop();
                }
            }
        }

        private static void AssertServiceResponse(ICloudServiceHost a)
        {
            var response = new WebClient().DownloadData(a.Address);
            Assert.IsNotNull(response);

            Trace.TraceInformation("Service: {0}; Response: {1}", a.Address, Encoding.Default.GetString(response));
        }
    }
}